#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
模板加载器 - 用于管理和加载各种组件模板
Template Loader - Manages and loads various component templates
"""

import os
import json
from typing import Dict, Any
from pathlib import Path

class TemplateLoader:
    """模板加载器类"""
    
    def __init__(self, template_dir: str = None):
        """初始化模板加载器"""
        if template_dir is None:
            self.template_dir = os.path.join(os.path.dirname(__file__), 'templates')
        else:
            self.template_dir = template_dir
        
        print(f"📁 模板目录: {self.template_dir}")
        
        # 模板文件映射
        self.template_files = {
            'vue': {
                'sidebar_menu': 'vue_sidebar_menu.vue',
                'sidebar_menu_item': 'vue_sidebar_menu_item.vue',
                'router': 'vue_router.js'
            },
            'react': {
                'sidebar_menu': 'react_sidebar_menu.jsx',
                'sidebar_menu_item': 'react_sidebar_menu_item.jsx',
                'css': 'sidebar_menu.css'
            }
        }
    
    def load_template(self, framework: str, template_name: str) -> str:
        """加载指定的模板文件"""
        try:
            template_file = self.template_files.get(framework, {}).get(template_name)
            if not template_file:
                raise ValueError(f"❌ 未找到模板: {framework}/{template_name}")
            
            template_path = os.path.join(self.template_dir, template_file)
            if not os.path.exists(template_path):
                raise FileNotFoundError(f"❌ 模板文件不存在: {template_path}")
            
            print(f"📄 加载模板: {template_path}")
            with open(template_path, 'r', encoding='utf-8') as f:
                return f.read()
                
        except Exception as e:
            print(f"❌ 加载模板失败: {str(e)}")
            return ""
    
    def generate_vue_components(self, menu_data: Dict[str, Any]) -> Dict[str, str]:
        """生成Vue组件代码"""
        print("🔧 生成Vue组件代码...")
        
        # 加载模板
        sidebar_template = self.load_template('vue', 'sidebar_menu')
        menu_item_template = self.load_template('vue', 'sidebar_menu_item')
        router_template = self.load_template('vue', 'router')
        
        # 替换菜单数据
        menu_json = json.dumps(menu_data.get('menu', []), ensure_ascii=False, indent=6)
        sidebar_content = sidebar_template.replace('{{MENU_DATA}}', menu_json)
        
        return {
            "SidebarMenu.vue": sidebar_content,
            "SidebarMenuItem.vue": menu_item_template,
            "router.js": router_template,
            "menuData.json": json.dumps(menu_data, ensure_ascii=False, indent=2)
        }
    
    def generate_react_components(self, menu_data: Dict[str, Any]) -> Dict[str, str]:
        """生成React组件代码"""
        print("🔧 生成React组件代码...")
        
        # 加载模板
        sidebar_template = self.load_template('react', 'sidebar_menu')
        menu_item_template = self.load_template('react', 'sidebar_menu_item')
        css_template = self.load_template('react', 'css')
        
        # 替换菜单数据
        menu_json = json.dumps(menu_data.get('menu', []), ensure_ascii=False, indent=2)
        sidebar_content = sidebar_template.replace('{{MENU_DATA}}', menu_json)
        
        return {
            "SidebarMenu.jsx": sidebar_content,
            "SidebarMenuItem.jsx": menu_item_template,
            "SidebarMenu.css": css_template,
            "menuData.json": json.dumps(menu_data, ensure_ascii=False, indent=2)
        }
    
    def list_available_templates(self) -> Dict[str, list]:
        """列出所有可用的模板"""
        return {
            framework: list(templates.keys()) 
            for framework, templates in self.template_files.items()
        }
